-- 历练 --
local Lang = require("common.Lang")
local Util = require("common.Util")
local Msg = require("core.Msg")
local ObjHuman = require("core.ObjHuman")
local LiLianExcel = require("excel.liLian")
local LiLianTaskExcel = require("excel.liLian").group
local BagLogic = require("bag.BagLogic")
local Grid = require("bag.Grid")
local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
local CombatDefine = require("combat.CombatDefine")
local HeroExcel = require("excel.hero")
local YjTreasureLogic = require("yjTreasure.YjTreasureLogic")
local ChatHandler = require("chat.Handler")
local Broadcast = require("broadcast.Broadcast")
local ChatLogic = require("chat.ChatLogic")
local RoleDBLogic = require("role.RoleDBLogic")
local Timer = require("core.Timer")
LILIAN_TASK_TYPE1 = 1 --竞技历练
LILIAN_TASK_TYPE2 = 2 --战斗历练
LILIAN_TASK_TYPE3 = 3 --终极历练
LILIAN_TASK_TYPE4 = 4 --达标奖励

LILIAN_TASK1 = 1 	--皇冠联赛中，6回合内战胜高战力对手，累计{1}次 o
LILIAN_TASK2 = 2 	--皇冠联赛中，4回合内战胜高战力对手，累计{1}次 o
LILIAN_TASK3 = 3	--众神之战累计进入{1}次32强 o
LILIAN_TASK4 = 4 	--众神之战累计进入{1}次8强 o
LILIAN_TASK5 = 5 	--获得{1}次众神之战冠军 o
LILIAN_TASK6 = 6 	--天梯争霸赛季结算时获得前{1}名 o
LILIAN_TASK7 = 7 	--天梯争霸累计挑战胜利{1}次 o
LILIAN_TASK8 = 8 	--巅峰段位赛累计获胜{1}场 x
LILIAN_TASK9 = 9 	--巅峰段位赛结算时达到铂金及以上段位 x
LILIAN_TASK10 = 10 	--巅峰段位赛结算时达到钻石及以上段位 x
LILIAN_TASK11 = 11 	--巅峰段位赛赛季结算时获得前{1}名 x
LILIAN_TASK12 = 12 	--通关通天塔{1}层 o
LILIAN_TASK13 = 13 	--挑战公会boss，当场累计造成{1}伤害 o
LILIAN_TASK14 = 14 	--公会战中累计获得{1}次个人胜利 o
LILIAN_TASK15 = 15 	--通关{1}次圣树试炼普通难度 o
LILIAN_TASK16 = 16 	--通关{1}次圣树试炼精英难度 o
LILIAN_TASK17 = 17 	--通关{1}次圣树试炼噩梦难度 o
LILIAN_TASK18 = 18 	--进入遗迹探宝{1}层 o
LILIAN_TASK19 = 19 	--遗迹探宝中累计击败{1}守卫 o
LILIAN_TASK20 = 20 	--单场公会boss累计造成{1}中毒伤害 o
LILIAN_TASK21 = 21 	--单场通天塔累计造成{1}流血伤害 o
LILIAN_TASK22 = 22 	--单场公会战累计造成{1}燃烧伤害 o
LILIAN_TASK23 = 23 	--通关无尽之路{1}关 x
LILIAN_TASK24 = 24 	--通关任意圣殿第{1}关 x
LILIAN_TASK25 = 25 	--本周内通关每个圣殿第{1}关 x
LILIAN_TASK26 = 26 	--守望圣殿排行榜结算时累计获得{1}次前10 x
LILIAN_TASK27 = 27 	--守望圣殿排行榜结算时累计获得{1}次前3 x
LILIAN_TASK28 = 28 	--完美通关神之领域前{1}章 x
LILIAN_TASK29 = 29 	--最高战力达到{1}万 o
LILIAN_TASK30 = 30 	--当前拥有{1}个10星英雄 o
LILIAN_TASK31 = 31 	--当前拥有{1}个11星英雄 o
LILIAN_TASK32 = 32 	--使{1}个恶魔英雄达到10星 1 o
LILIAN_TASK33 = 33 	--使{1}个恶魔英雄达到11星   o
LILIAN_TASK34 = 34 	--使{1}个不死英雄达到10星 2 o
LILIAN_TASK35 = 35 	--使{1}个不死英雄达到11星   o
LILIAN_TASK36 = 36 	--使{1}个圣堂英雄达到10星 3 o
LILIAN_TASK37 = 37 	--使{1}个圣堂英雄达到11星   o
LILIAN_TASK38 = 38 	--使{1}个神谕英雄达到10星 4 o
LILIAN_TASK39 = 39 	--使{1}个神谕英雄达到11星   o
LILIAN_TASK40 = 40 	--使{1}个混沌英雄达到10星 5 o
LILIAN_TASK41 = 41 	--使{1}个混沌英雄达到11星   o
LILIAN_TASK42 = 42 	--任意一场众神之战中{1}次竞猜全部正确 o
LILIAN_TASK43 = 43 	--普通招募累计活动{1}个5星英雄 o
LILIAN_TASK44 = 44 	--友情招募累计获得{1}个5星英雄 o
LILIAN_TASK45 = 45 	--累计获得{1}个神话符文 o
LILIAN_TASK46 = 46 	--累计获得{1}个传说符文 o
LILIAN_TASK47 = 47 	--累计领悟{1}本初级兵书 o
LILIAN_TASK48 = 48 	--累计领悟{1}本中级兵书 o
LILIAN_TASK49 = 49 	--累计充值{1}钻石 o
LILIAN_TASK50 = 50 	--公会建设中累计花费{1}钻石 o
LILIAN_TASK51 = 51 	--获得{1}次公会红包的手气最佳 o
LILIAN_TASK52 = 52 	--发放的红包累计超过{1}钻石 o
LILIAN_TASK53 = 53 	--累计完成{1}个历练任务 o

LILIAN_OUTID1 = 1 --皇冠联赛中，x回合内战胜高战力对手，累计{1}次
LILIAN_OUTID2 = 2 --众神之战累计进入{1}次x强
LILIAN_OUTID3 = 3 --天梯争霸赛季结算时获得前{1}名
LILIAN_OUTID4 = 4 --天梯争霸累计挑战胜利{1}次
LILIAN_OUTID5 = 5 --巅峰段位赛累计获胜{1}场
LILIAN_OUTID6 = 6 --巅峰段位赛结算时达到x及以上段位
LILIAN_OUTID7 = 7 --巅峰段位赛赛季结算时获得前{1}名
LILIAN_OUTID8 = 8 --通关通天塔{1}层
LILIAN_OUTID9 = 9 --挑战公会boss，当场累计造成{1}伤害
LILIAN_OUTID10 = 10 --公会战中累计获得{1}次个人胜利
LILIAN_OUTID11 = 11 --通关{1}次圣树试炼x难度
LILIAN_OUTID12 = 12 --进入遗迹探宝{1}层
LILIAN_OUTID13 = 13 --遗迹探宝中累计击败{1}守卫
LILIAN_OUTID14 = 14 --单场公会boss累计造成{1}中毒伤害
LILIAN_OUTID15 = 15 --单场通天塔累计造成{1}流血伤害
LILIAN_OUTID16 = 16 --单场公会战累计造成{1}燃烧伤害
LILIAN_OUTID17 = 17 --通关无尽之路{1}关
LILIAN_OUTID18 = 18 --通关任意圣殿第{1}关
LILIAN_OUTID19 = 19 --本周内通关每个圣殿第{1}关
LILIAN_OUTID20 = 20 --守望圣殿排行榜结算时累计获得{1}次前x
LILIAN_OUTID21 = 21 --完美通关神之领域前{1}章
LILIAN_OUTID22 = 22 --最高战力达到{1}
LILIAN_OUTID23 = 23 --当前拥有{1}个x星英雄
LILIAN_OUTID24 = 24 --使{1}个x英雄达到x星
LILIAN_OUTID25 = 25 --任意一场众神之战中{1}次竞猜全部正确
LILIAN_OUTID26 = 26 --普通招募累计活动{1}个x星英雄
LILIAN_OUTID27 = 27 --友情招募累计获得{1}个x星英雄
LILIAN_OUTID28 = 28 --累计获得{1}个x符文
LILIAN_OUTID29 = 29 --累计充值{1}钻石九 零 一 起玩 www.9 0 1 7 5.com 
LILIAN_OUTID30 = 30 --公会建设中累计花费{1}钻石
LILIAN_OUTID31 = 31 --获得{1}次公会红包的手气最佳
LILIAN_OUTID32 = 32 --发放的红包累计超过{1}钻石
LILIAN_OUTID33 = 33 --累计完成{1}个历练任务

LILIAN_OUT2TASK = {
	[LILIAN_OUTID1] = {LILIAN_TASK1,LILIAN_TASK2},
	[LILIAN_OUTID2] = {LILIAN_TASK3,LILIAN_TASK4,LILIAN_TASK5},
	[LILIAN_OUTID3] = {LILIAN_TASK6},
	[LILIAN_OUTID4] = {LILIAN_TASK7},
	[LILIAN_OUTID5] = {LILIAN_TASK8},
	[LILIAN_OUTID6] = {LILIAN_TASK9,LILIAN_TASK10},
	[LILIAN_OUTID7] = {LILIAN_TASK11},
	[LILIAN_OUTID8] = {LILIAN_TASK12},
	[LILIAN_OUTID9] = {LILIAN_TASK13},
	[LILIAN_OUTID10] = {LILIAN_TASK14},
	[LILIAN_OUTID11] = {LILIAN_TASK15,LILIAN_TASK16,LILIAN_TASK17},
	[LILIAN_OUTID12] = {LILIAN_TASK18},
	[LILIAN_OUTID13] = {LILIAN_TASK19},
	[LILIAN_OUTID14] = {LILIAN_TASK20},
	[LILIAN_OUTID15] = {LILIAN_TASK21},
	[LILIAN_OUTID16] = {LILIAN_TASK22},
	[LILIAN_OUTID17] = {LILIAN_TASK23},
	[LILIAN_OUTID18] = {LILIAN_TASK24},
	[LILIAN_OUTID19] = {LILIAN_TASK25},
	[LILIAN_OUTID20] = {LILIAN_TASK26,LILIAN_TASK27},
	[LILIAN_OUTID21] = {LILIAN_TASK28},
	[LILIAN_OUTID22] = {LILIAN_TASK29},
	[LILIAN_OUTID23] = {LILIAN_TASK30,LILIAN_TASK31},
	[LILIAN_OUTID24] = {LILIAN_TASK32,LILIAN_TASK33,LILIAN_TASK34,LILIAN_TASK35,LILIAN_TASK36,LILIAN_TASK37,LILIAN_TASK38,LILIAN_TASK39,LILIAN_TASK40,LILIAN_TASK41},
	[LILIAN_OUTID25] = {LILIAN_TASK42},
	[LILIAN_OUTID26] = {LILIAN_TASK43},
	[LILIAN_OUTID27] = {LILIAN_TASK44},
	[LILIAN_OUTID28] = {LILIAN_TASK45,LILIAN_TASK46,LILIAN_TASK47,LILIAN_TASK48},
	[LILIAN_OUTID29] = {LILIAN_TASK49},
	[LILIAN_OUTID30] = {LILIAN_TASK50},
	[LILIAN_OUTID31] = {LILIAN_TASK51},
	[LILIAN_OUTID32] = {LILIAN_TASK52},
	[LILIAN_OUTID33] = {LILIAN_TASK53},
}

LILIAN_STATE_NOT = 0            -- 未完成
LILIAN_STATE_CAN = 1            -- 可获取
LILIAN_STATE_HAD = 2            -- 已获取

-- 根据历练类型获取配表
local function getConfigByType(lilianType)
	if lilianType == LILIAN_TASK_TYPE1 then
		return LiLianExcel.jjcLiLian
	elseif lilianType == LILIAN_TASK_TYPE2 then
		return LiLianExcel.combatLiLian
	elseif lilianType == LILIAN_TASK_TYPE3 then
		return LiLianExcel.finalLiLian
	elseif lilianType == LILIAN_TASK_TYPE4 then
		return LiLianExcel.dabiaoReward
	end
end

-- 获取历练组id详细历练配置
-- config 历练类型配表
-- groupID 历练任务组
function getLiLianConf(human,config,groupID)
    -- 初始化历练db
    human.db.liLianGroup = human.db.liLianGroup or {}
	human.db.liLianGroup[groupID] = human.db.liLianGroup[groupID] or {0,1}

	local liLianDB = human.db.liLianGroup[groupID]
	local groupConfig = LiLianTaskExcel[groupID]

	if groupConfig == nil then
		return
	end
	
	local liLianID = groupConfig.sub[liLianDB[2]]
	return config[liLianID],groupConfig,liLianID
end

-- 获取背包中传入星级英雄个数
local function getStarHeroCnt(human,starTarget)
	local cnt = 0 
	for index, heroGrid in pairs(human.db.heroBag) do
		if index ~= 0 then
			local id = heroGrid and (heroGrid.id or heroGrid.heroID) 
			local config = id and HeroExcel.hero[id]
			local star = config and config.star or 0
			if star == starTarget then
				cnt = cnt + 1
			end
		end
	end
	return cnt
end

-- 获取任务组完成次数
local function getFinishCntByTask(human,groupID)
	--通天塔
	if groupID == LILIAN_TASK12 then
		return human.db.tower and human.db.tower.lv or 0 
	--遗迹探宝
	elseif groupID == LILIAN_TASK18 then
		return YjTreasureLogic.getLayerMax(human)
	-- --无尽之路
	-- elseif task == LILIAN_TASK23 then
	-- 	return
	-- --任意圣殿x关
	-- elseif task == LILIAN_TASK24 then
	-- 	return
	-- --每个圣殿x关
	-- elseif task == LILIAN_TASK25 then
	-- 	return
	-- --神之领域x章
	-- elseif task == LILIAN_TASK28 then
	-- 	return
	--x个10星英雄
	elseif groupID == LILIAN_TASK30 then
		return getStarHeroCnt(human,10)
	--x个11星英雄
	elseif groupID == LILIAN_TASK31 then
		return getStarHeroCnt(human,11)
	--累充
	elseif groupID == LILIAN_TASK49 then
		return human.db.topupAcountDaily or 0
	end

	return human.db.liLian and human.db.liLian.taskRecord and human.db.liLian.taskRecord[groupID] or 0
end

-- 根据历练类型及历练id获取历练状态
local function getStateByLiLianID(human,taskType,id)
	local config = getConfigByType(taskType)

	if not config or not config[id] then
        return LILIAN_STATE_NOT 
    end

	if human.db.liLian 
        and human.db.liLian[taskType]
		and human.db.liLian[taskType].getList 
		and human.db.liLian[taskType].getList[id] then
		return LILIAN_STATE_HAD
	end

	local need = config[id].param
	local now = getFinishCntByTask(human,config[id].task)
	local taskConfig = LiLianExcel.tasks[config[id].task]
	if taskConfig.compareType ~= 0 then
		if now <= need and now ~= 0 then return LILIAN_STATE_CAN end
	else
		if now >= need then return LILIAN_STATE_CAN end
	end

	return LILIAN_STATE_NOT
end

-- 构造历练任务结构体
local function makeLiLianTask(human,net,config,taskType,id)
	net.id = id
	net.taskName = config.taskName
	net.taskDesc = config.desc
	net.finishCnt = getFinishCntByTask(human,config.task)	
	net.needCnt = config.param
	net.state = getStateByLiLianID(human,taskType,id)
	net.panelID = config.panelID

	net.items[0] = #config.reward
	for i=1,#config.reward do
		Grid.makeItem(net.items[i],config.reward[i][1],config.reward[i][2])
	end
end

-- 获取一个类型所有任务完成数量
local function getAllFinishCnt(human,taskType)
	local getList = nil
	if human.db.liLian
		and human.db.liLian[taskType]
		and human.db.liLian[taskType]
		and human.db.liLian[taskType].getList then
		getList = human.db.liLian[taskType].getList
	end
	
	local cnt = 0
	if getList then
		for _,_ in pairs(getList) do
			cnt = cnt + 1
		end
	end

	local config = getConfigByType(taskType)
	return cnt,#config
end

-- 红点检查
local function isRedByTaskType(human,taskType)
	local config = getConfigByType(taskType)
	for i=1,#config do
		local state = getStateByLiLianID(human,taskType,i)
		if state == LILIAN_STATE_CAN then
			return true
		end
	end
end

-- 
local function makeLiLianTaskState(human,net,taskType)
	net[0] = 4

	local index = 0
	for i=1,4 do
		index = index + 1
		net[index].taskType = i

		local finishCnt,needCnt = getAllFinishCnt(human,i)
		net[index].finishCnt = finishCnt
		net[index].needCnt = needCnt
		net[index].isRed = isRedByTaskType(human,i) and 1 or 0
	end
end

-- 查询历练
function lilianQuery(human,taskType)
	local config = getConfigByType(taskType)
	if not config then return end

	local msgRet = Msg.gc.GC_LILIAN_QUERY
	msgRet.taskType = taskType
	
    local len = #LiLianTaskExcel
    local count = 0
	for i=1,len do
        if LiLianTaskExcel[i].taskType == taskType then
            local lilianConfig,groupConfig,id = getLiLianConf(human,config,i)
            if lilianConfig ~= nil then
                count = count + 1
		        makeLiLianTask(human,msgRet.lists[count],lilianConfig,taskType,id)
            end
        end
	end
    
	msgRet.lists[0] = count
	makeLiLianTaskState(human,msgRet.taskState,taskType)
	--Msg.trace(msgRet)
	Msg.send(msgRet,human.fd)
end

function lilianGet(human,taskType,liLianID)
	local config = getConfigByType(taskType)

	if not config or not config[liLianID] then
        return 
    end

	local state = getStateByLiLianID(human,taskType,liLianID)
	if state ~= LILIAN_STATE_CAN then 
        return
    end

	human.db.liLian = human.db.liLian or {}
	human.db.liLian[taskType] = human.db.liLian[taskType] or {}
	human.db.liLian[taskType].getList = human.db.liLian[taskType].getList or {}
	human.db.liLian[taskType].getList[liLianID] = liLianID
    
    human.db.liLianGroup = human.db.liLianGroup or {}
	human.db.liLianGroup[config[liLianID].task] = human.db.liLianGroup[config[liLianID].task] or {0,1}
	human.db.liLianGroup[config[liLianID].task][2] = human.db.liLianGroup[config[liLianID].task][2] + 1 

    BagLogic.addItemList(human, config[liLianID].reward, "li_lian")
    lilianQuery(human,taskType)
	onCallback(human,LILIAN_OUTID33,1,nil,nil,true)
end

-- 
function setCnt(human,task,param1,noAdd)
	if noAdd then
		human.db.liLian = human.db.liLian or {}
		human.db.liLian.taskRecord = human.db.liLian.taskRecord or {}
		human.db.liLian.taskRecord[task] = param1
	else
		human.db.liLian = human.db.liLian or {}
		human.db.liLian.taskRecord = human.db.liLian.taskRecord or {}
		human.db.liLian.taskRecord[task] = (human.db.liLian.taskRecord[task] or 0 ) + param1
	end

--	print("human.db.liLian.taskRecord[task]",human.db.liLian.taskRecord[task])
end

-- 触发回调
function onCallback(human,outID,param1,param2,param3,noAdd)
	if not LILIAN_OUT2TASK[outID] then return end
	for i=1,#LILIAN_OUT2TASK[outID] do
		local task = LILIAN_OUT2TASK[outID][i]
		local taskConfig = LiLianExcel.tasks[task]
		local set = true
		local paramCnf = taskConfig.param
		if #paramCnf > 0 then
			local paramCnf1 = paramCnf[1]
			local paramCnf2 = paramCnf[2] or 0
			if param2 ~= paramCnf1 then
				set = nil
			end

			if paramCnf2 ~= 0 then
				if param3 ~= paramCnf2 then
					set = nil
				end
			end

			if outID == LILIAN_OUTID1 or outID == LILIAN_OUTID2 or outID == LILIAN_OUTID20 then
				if param2 <= paramCnf1 then
					set = true
				end
			end
		else
			local nowCnt = getFinishCntByTask(human,task)
			if nowCnt ~= 0 then
				if taskConfig.compareType ~= 0 then
					if nowCnt <= param1 then
						set = nil
					end
				else
					if nowCnt >= param1 then
						set = nil
					end
				end
			end
		end

		if set then
			setCnt(human,task,param1,noAdd)
		end
	end
end


function onCallbackByUuid(uuid,task,param1,param2,param3,noAdd)
	do return end

	local target = ObjHuman.onlineUuid[uuid]
	if target and target.fd then
		onCallback(target,task,param1,param2,param3,noAdd)
	else
		local fakeDB = RoleDBLogic.getDb(uuid,{liLian = 1})
		if fakeDB then
			local fakeHuman = {}
			fakeHuman.db = fakeDB
			onCallback(fakeHuman,task,param1,param2,param3,noAdd)
			ObjHuman.save(fakeHuman)
		end
	end	
end

function onCallbackByCombat(human,combatInfo)
	do return end

	if not combatInfo then return end
	
	local attacker = combatInfo.attacker
	local defender = combatInfo.defender
	local combatType = combatInfo.type

	if combatType ~= CombatDefine.COMBAT_TYPE2 or --皇冠联赛/冠军联赛（进攻）
		combatType ~= CombatDefine.COMBAT_TYPE11 or --公会boss
		combatType ~= CombatDefine.COMBAT_TYPE12 or --公会战（进攻）
		combatType ~= CombatDefine.COMBAT_TYPE6 then --通天塔/恶魔之塔
		return
	end

	if attacker.uuid ~= human.db._id then return end
	
	if attacker.zhandouli < defender.zhandouli and combatType == CombatDefine.COMBAT_TYPE2 then
		onCallback(human,LILIAN_OUTID1,1,combatInfo.result.round)
	end
	
	local totalzhongdu = nil
	local totalliuxue = nil
	local totalranshao = nil
	local totalhurt = nil
	for pos = 1, CombatDefine.COMBAT_HERO_CNT do
		local obj = objList and objList[pos]
		if obj then
			local extraCombatRecord = obj.extraCombatRecord
			local zhongdu = extraCombatRecord and extraCombatRecord.zhongdu or 0
			local liuxue = extraCombatRecord and extraCombatRecord.liuxue or 0
			local ranshao = extraCombatRecord and extraCombatRecord.ranshao or 0
			local hurt = obj.result and obj.result[1] or 0

			if zhongdu > 0 and combatType == CombatDefine.COMBAT_TYPE11 then
				totalzhongdu = (totalzhongdu or 0) + zhongdu
			end

			if liuxue > 0 and combatType == CombatDefine.COMBAT_TYPE6 then
				totalliuxue = (totalliuxue or 0) + liuxue
			end

			if ranshao > 0 and combatType == CombatDefine.COMBAT_TYPE12 then
				totalranshao = (totalranshao or 0) + ranshao
			end

			if hurt > 0 and combatType == CombatDefine.COMBAT_TYPE11 then
				totalhurt = (totalhurt or 0) + hurt
			end
		end 
	end

	if totalzhongdu then
		onCallback(human,LILIAN_OUTID14,totalzhongdu)
	end

	if totalliuxue then
		onCallback(human,LILIAN_OUTID15,totalliuxue)
	end

	if totalranshao then
		onCallback(human,LILIAN_OUTID16,totalliuxue)
	end

	if totalhurt then
		onCallback(human,LILIAN_OUTID9,totalhurt)
	end
end

-- 历练分享
function lilianShare(human,taskType,id,shareType)
	local state = getStateByLiLianID(human,taskType,id)
	if state ~= LILIAN_STATE_HAD then return end

	if shareType ~= ChatHandler.CHAT_TYPE_WORLD and shareType ~= ChatHandler.CHAT_TYPE_UNION and shareType ~= ChatHandler.CHAT_TYPE_MIDDLE then
		return
	end
	
	-- 如果是分享在世界上检测是否在聊天CD 中
	if shareType == ChatHandler.CHAT_TYPE_WORLD and human.worldChatTime and human.worldChatTime + CHAT_CD > Timer.now then
		local cdLeftSec = math.ceil((CHAT_CD - (Timer.now - human.worldChatTime))/1000)
		Broadcast.sendDown(human, Util.format(Lang.CHAT_TIME_SHORT, cdLeftSec))
		return
	end

	if shareType == ChatHandler.CHAT_TYPE_UNION and human.db.unionUuid == nil then
		return Broadcast.sendErr(human, Lang.UNION_PLAYER_IN_NO)
	end
	
	local shareConf = LiLianExcel.share[taskType]
	if not shareConf then return end

	local config = getConfigByType(taskType)
	if not config then return end

	local name = shareConf.name
	local desc = shareConf.desc
	local taskName = config[id].taskName

	local content = Util.format(desc,name,taskName)

    local msgNet = {}
    msgNet.msgType = shareType
    msgNet.msg = content

	local flag = ChatLogic.chat(human, msgNet)
    if flag == true then
        Broadcast.sendErr(human, Lang.SHARE_SUCCESS)
    else
        Broadcast.sendErr(human, Lang.SHARE_ERROR)
    end
end


function isDot(human)
   for i = 1, 4 do
   	  if isRedByTaskType(human,i) then
         return true
      end
   end
   return false
end